#version 450

layout(location=0) in vec3 v_Normal;
layout(location=1) in vec3 v_Color;
layout(location=2) in vec3 v_LightVec;
layout(location=3) in vec3 v_ViewVec;

layout(location=0) out vec4 fragColor;

void main() {
    // Desaturate color
    vec3 color = vec3(mix(v_Color, vec3(dot(vec3(0.2126, 0.7152, 0.0722), v_Color)), 0.65));

    vec3 ambient = color * vec3(1.0);
    vec3 N = normalize(v_Normal);
    vec3 L = normalize(v_LightVec);
    vec3 V = normalize(v_ViewVec);
    vec3 R = reflect(-L, N);
    vec3 diffuse = max(dot(N, L), 0.0) * color;
    vec3 specular = pow(max(dot(R, V), 0.0), 32.0) * vec3(0.35);

    fragColor = vec4(ambient + diffuse * 1.75 + specular, 1.0);

    float intensity = dot(N, L);
    float shade = 1.0;
    shade = intensity < 0.5 ? 0.75 : shade;
    shade = intensity < 0.35 ? 0.6 : shade;
    shade = intensity < 0.25 ? 0.5 : shade;
    shade = intensity < 0.1 ? 0.25 : shade;

    fragColor.rgb = v_Color * 3.0 * shade;
}